package main

import (
	"fmt"
	"gitee.com/changzer/zink/zink/znet"
	"io"
	"net"
	"time"
)

func main() {
	fmt.Println("client start ...")

	time.Sleep(1 * time.Second)
	// 1 连接服务器
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("client start err, exit!")
		return
	}

	for {
		// 发送封包的message消息
		dp := znet.NewDataPack()
		binaryMsg, err := dp.Pack(znet.NewMessage(0, []byte("Zinx 00000 Client Test Message")))
		if err != nil {
			return
		}
		if _, err := conn.Write(binaryMsg); err != nil {
			fmt.Println("write error err ", err)
			return
		}

		// 服务器就应该给我们回复一个message数据，msgID:1 ping...ping...ping
		// 1. 先读取流中的head部分，得到ID和dataLen
		binaryHead := make([]byte, dp.GetHeadLen())
		if _, err := conn.Read(binaryHead); err != nil {
			fmt.Println("read head error")
			break
		}
		// 将二进制的head拆包到msg结构体中
		msgHead, err := dp.Unpack(binaryHead)
		if err != nil {
			fmt.Println("server unpack err:", err)
			return
		}
		if msgHead.GetMsgLen() > 0 {
			// msg 是有data数据的，需要再次读取data数据
			msg := msgHead.(*znet.Message)
			msg.Data = make([]byte, msg.GetMsgLen())

			// 根据dataLen从io中读取字节流
			if _, err := io.ReadFull(conn, msg.Data); err != nil {
				fmt.Println("server unpack data err:", err)
				return
			}
			fmt.Println("==> Recv Server Msg: ID=", msg.Id, ", len=", msg.DataLen, ", data=", string(msg.Data))
		}
		// cpu阻塞
		time.Sleep(1 * time.Second)
	}
}
